package br.unifor.bd.io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

import br.unifor.bd.protocol.Operacao;
import br.unifor.bd.protocol.TipoDeOperacao;
import br.unifor.bd.protocol.Transacao;

public class LeitorDeTransacoes {

	private final File diretorio;
	
	public LeitorDeTransacoes(String nomeDoArquivo) {
		this.diretorio = new File(nomeDoArquivo);
	}
	
	private String getIdDaTransacao(File arquivoDeTransacao) {
		return arquivoDeTransacao.getName().replace(".txt", "");
	}
	
	private Vector<Transacao> listarTransacoes() throws IOException {
		Vector<Transacao> transacoes = new Vector<Transacao>();
		
		Long hora = System.currentTimeMillis();
		
		for (File transacao : diretorio.listFiles()) {
			if (transacao.isFile()) {
				String id = getIdDaTransacao(transacao);
				
				hora += 10;
				
				transacoes.add(new Transacao(id, getOperacoesDaTransacao(transacao), hora));
			}
		}
		
		Collections.shuffle(transacoes);
		
		System.out.println("Transacoes randomizadas: " + transacoes.toString());
		
		return transacoes;
	}
	
	public synchronized Vector<Operacao> listarTodasOperacoes() throws IOException {
		Vector<Operacao> operacoes = new Vector<Operacao>();
		
		List<Transacao> transacoes = listarTransacoes();
		
		for (Transacao transacao : transacoes) {
			operacoes.addAll(transacao.getOperacoes());
		}
		
		return operacoes;
	}
	
	private List<Operacao> getOperacoesDaTransacao(File transacao) throws IOException {
		List<Operacao> operacoes = new ArrayList<Operacao>();
		
		BufferedReader reader = new BufferedReader(new FileReader(transacao));
		
		while (reader.ready()) {
			String linha = reader.readLine();
			TipoDeOperacao tipo = TipoDeOperacao.procurarPeloTipo(linha.charAt(0));
			
			
			if (linha.length() == 1) {
				operacoes.add(new Operacao(tipo, getIdDaTransacao(transacao)));
				continue;
			}
			
			char alvo = linha.charAt(2);
			operacoes.add(new Operacao(tipo, getIdDaTransacao(transacao), alvo));
		}
		
		reader.close();
		
		return operacoes;
	}
	
}
